home *** CD-ROM | disk | FTP | other *** search
-
-
-
- XXXXmmmmRRRReeeessssoooollllvvvveeeeAAAAllllllllPPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVVXXXXmmmmRRRReeeessssoooollllvvvveeeeAAAAllllllllPPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))
-
-
-
- NNNNAAAAMMMMEEEE
- _X_m_R_e_s_o_l_v_e_A_l_l_P_a_r_t_O_f_f_s_e_t_s - A function that allows writing of
- upward-compatible applications and widgets
-
- SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
- #include <Xm/XmP.h>
-
- void XmResolveAllPartOffsets (wwwwiiiiddddggggeeeetttt____ccccllllaaaassssssss,,,, ooooffffffffsssseeeetttt,,,, ccccoooonnnnssssttttrrrraaaaiiiinnnntttt____ooooffffffffsssseeeetttt)
- _W_i_d_g_e_t_C_l_a_s_swwwwiiiiddddggggeeeetttt____ccccllllaaaassssssss;
- _X_m_O_f_f_s_e_t_P_t_r**** ooooffffffffsssseeeetttt;
- _X_m_O_f_f_s_e_t_P_t_r**** ccccoooonnnnssssttttrrrraaaaiiiinnnntttt____ooooffffffffsssseeeetttt;
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- The use of offset records requires two extra global
- variables per widget class. The variables consist of
- pointers to arrays of offsets into the widget record and
- constraint record for each part of the widget structure.
- The _X_m_R_e_s_o_l_v_e_A_l_l_P_a_r_t_O_f_f_s_e_t_s function allocates the offset
- records needed by an application to guarantee upward-
- compatible access to widget instance and constraint records
- by applications and widgets. These offset records are used
- by the widget to access all of the widget's variables. A
- widget needs to take the following steps:
-
- +o Instead of creating a resource list, the widget creates
- an offset resource list. To help you accomplish this,
- use the _X_m_P_a_r_t_R_e_s_o_u_r_c_e structure and the _X_m_P_a_r_t_O_f_f_s_e_t
- macro. The _X_m_P_a_r_t_R_e_s_o_u_r_c_e data structure looks just
- like a resource list, but instead of having one integer
- for its offset, it has two shorts. This is put into
- the class record as if it were a normal resource list.
- Instead of using _X_t_O_f_f_s_e_t for the offset, the widget
- uses _X_m_P_a_r_t_O_f_f_s_e_t.
-
- If the widget is a subclass of the Constraint class and it
- defines additional constraint resources, create an offset
- resource list for the constraint part as well. Instead of
- using _X_t_O_f_f_s_e_t for the offset, the widget uses
- _X_m_C_o_n_s_t_r_a_i_n_t_P_a_r_t_O_f_f_s_e_t in the constraint resource list.
- XmPartResource resources[] = {
- { BarNxyz, BarCXyz, XmRBoolean, sizeof(Boolean),
- XmPartOffset(Bar,xyz), XmRImmediate, (XtPointer)False } };
-
- XmPartResource constraints[] = {
- { BarNmaxWidth, BarNMaxWidth,
- XmRDimension, sizeof(Dimension),
- XmConstraintPartOffset(Bar,max_width),
- XmRImmediate, (XtPointer)100 } };
-
- +o Instead of putting the widget size in the class record, the widget puts the
- widget part size in the same field.
- If the widget is a subclass of
- the Constraint class, instead of putting the widget constraint record
-
-
- Page 1 (printed 11/11/03)
-
-
-
-
-
-
- XXXXmmmmRRRReeeessssoooollllvvvveeeeAAAAllllllllPPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVVXXXXmmmmRRRReeeessssoooollllvvvveeeeAAAAllllllllPPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))
-
-
-
- size in the class record, the widget puts the widget constraint part size
- in the same field.
-
- +o Instead of putting _X_t_V_e_r_s_i_o_n in the class record, the widget puts
- _X_t_V_e_r_s_i_o_n_D_o_n_t_C_h_e_c_k in the class record.
-
- +o Define a variable, of type _X_m_O_f_f_s_e_t_P_t_r, to point to
- the offset record.
- If the widget is a subclass of the Constraint class, define a variable
- of type XmOffsetPtr to point to the constraint offset record.
- These can be part of the widget's class record or separate global
- variables.
-
- +o In class initialization, the widget calls _X_m_R_e_s_o_l_v_e_A_l_l_P_a_r_t_O_f_f_s_e_t_s,
- passing it pointers to the class record, the address of the offset
- record, and the address of the constraint offset record.
- If the widget not is a subclass of the Constraint class, it should pass
- NULL as the address of the constraint offset record.
- This does several things:
-
- Adds the superclass (which, by definition, has already been initialized)
- size field to the part size field
-
- If the widget is a subclass of the Constraint class, adds the superclass
- constraint size field to the constraint size field
-
- Allocates an array based upon the number of superclasses
-
- If the widget is a subclass of the constraint class, allocates an array
- for the constraint offset record
-
- Fills in the offsets of all the widget parts and constraint parts with
- the appropriate values, determined by examining the size fields of all
- superclass records
-
- Uses the part offset array to modify the offset entries in the resource
- list to be real offsets, in place
-
- +o The widget defines a constant which will be the index to its part
- structure in the offsets array.
- The value should be 1 greater than
- the index of the widget's superclass.
- Constants defined for all Xm
- widgets can be found in _X_m_P._h.
- #define BarIndex (XmBulletinBIndex + 1)
-
-
-
-
-
-
-
-
-
-
- Page 2 (printed 11/11/03)
-
-
-
-
-
-
- XXXXmmmmRRRReeeessssoooollllvvvveeeeAAAAllllllllPPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVVXXXXmmmmRRRReeeessssoooollllvvvveeeeAAAAllllllllPPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))
-
-
-
- +o Instead of accessing fields directly, the widget must always go through
- the offset table.
- The _X_m_F_i_e_l_d and _X_m_C_o_n_s_t_r_a_i_n_t_F_i_e_l_d macros help you access
- these fields.
- Because the _X_m_P_a_r_t_O_f_f_s_e_t, _X_m_C_o_n_s_t_r_a_i_n_t_P_a_r_t_O_f_f_s_e_t,
- _X_m_F_i_e_l_d, and _X_m_C_o_n_s_t_r_a_i_n_t_F_i_e_l_d
- macros concatenate things together, you must ensure that there is no space
- after the part argument.
- For example, the following macros do not work because of the space
- after the part (Label) argument:
- XmField(w, offset, Label , text, char *)
- XmPartOffset(Label , text).
- Therefore, you must not have any spaces after the part (Label)
- argument, as illustrated here:
- XmField(w, offset, Label, text, char *)
- You can define macros for each field to make this easier.
- Assume an integer field xxxxyyyyzzzz:
- #define BarXyz(w) (*(int *)(((char *) w) + \
- offset[BarIndex] + XtOffset(BarPart,xyz)))
-
- For constraint field mmmmaaaaxxxx____wwwwiiiiddddtttthhhh:
- #define BarMaxWidth(w) \
- XmConstraintField(w,constraint_offsets,Bar,max_width,Dimension)
-
- The parameters for _X_m_R_e_s_o_l_v_e_A_l_l_P_a_r_t_O_f_f_s_e_t_s are defined below:
-
- wwwwiiiiddddggggeeeetttt____ccccllllaaaassssssss
- Specifies the widget class pointer for the created widget
-
- ooooffffffffsssseeeetttt
- Returns the offset record
-
- ccccoooonnnnssssttttrrrraaaaiiiinnnntttt____ooooffffffffsssseeeetttt
- Returns the constraint offset record
-
- RRRREEEELLLLAAAATTTTEEEEDDDD IIIINNNNFFFFOOOORRRRMMMMAAAATTTTIIIIOOOONNNN
- _X_m_R_e_s_o_l_v_e_P_a_r_t_O_f_f_s_e_t_s(_3_X).
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 3 (printed 11/11/03)
-
-
-
-